#ifndef __WED_SAL_SOCRET_H__
#define __WED_SAL_SOCRET_H__
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "Wed_common.h"
#include "Wed_errno.h"
#include "print/wed_print.h"
#include "kernel/Wed_mutex.h"
#include "mem/Wed_mem.h"

/* \brief 魔法数 */
#define WED_SAL_SOCKET_MAGIC   0x5A10

/* \brief socket 最大数量 */
#ifndef WED_SAL_SOCKETS_NUM
#define WED_SAL_SOCKETS_NUM    4
#endif

/* \brief socket 索引偏移 */
#ifndef WED_SAL_SOCKET_OFFSET
#define WED_SAL_SOCKET_OFFSET  0
#endif

/* \brief socket 结构体 */
struct Wed_sal_socket {
    uint32_t       magic;                    /* 魔法数 */
    int            socket;                   /* SAL socket descriptor */
    int            domain;                   /* 通信域 */
    int            type;                     /* socket 类型 */
    int            protocol;                 /* 通信协议 */

    //struct netdev *p_net_dev;              /* SAL network interface device */

    void          *p_usr_data;                   /* user-specific data */
#ifdef SAL_USING_TLS
    void *user_data_tls;               /* user-specific TLS data */
#endif
};

/* \brief socket 表结构体 */
struct Wed_sal_socket_table {
    uint32_t               max_socket;   /* 最大 socket 数量 */
    struct Wed_sal_socket *p_sockets;
};

/**
 * \brief 软件抽象层 socket 初始化
 *        SAL（Software Abstraction Layer）
 *
 * @return 成功返回 0
 */
int Wed_sal_socket_init(void);
/**
 * \brief 通过索引获取 socket 结构体
 *
 * @param socket_idx socket 索引
 *
 * @return 成功返回 socket 结构体
 */
struct Wed_sal_socket *Wed_sal_socket_get_by_idx(int socket_idx);
#endif
